操作系统实验一 进程控制实验 您所在的位置:网站首页 linux常用命令 实验报告 操作系统实验一 进程控制实验

操作系统实验一 进程控制实验

2023-07-09 06:23| 来源: 网络整理| 查看: 265

实验一 进程控制实验 班级:学号:姓名: 一、实验目的 加深对于进程并发执行概念的理解。实践并发进程的创建和控制方法。观察和 体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过 程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习 Linux 系统中 进程创建与控制有关的系统调用的编程和调试技术。 二、实验内容 参考以上示例程序中建立并发进程的方法,编写一个多进程并发执行程序。父进 程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制 ps 命令总在 ls 命令之前执行。 三、实验要求 根据实验中观察和记录的信息结合示例实验和独立实验程序,说明它们反映出操 作系统教材中进程及处理机管理一节讲解的进程的哪些特征和功能?在真实的操作 系统中它是怎样实现和反映出教材中讲解的进程的生命期、进程的实体和进程状态 控制的。你对于进程概念和并发概念有哪些新的理解和认识?子进程是如何创建和 执行新程序的?信号的机理是什么?怎样利用信号实现进程控制?根据实验程序、 调试过程和结果分析写出实验报告。 四、实验步骤

打开一终端命令行窗体,新建一个文件夹,在该文件夹中建立以下名为pctl.c 的C语言程序: (调用实例实验代码) #include “pctl.h” int main(int argc, char *argv[]) { int i; int pid; //存放子进程号 int status; //存放子进程返回状态 char *args[] = {“/bin/ls”,“-a”,NULL}; //子进程要缺省执行的命令 signal(SIGINT,(sighandler_t)sigcat); //注册一个本进程处理键盘中断的函数 pid=fork() ; //建立子进程 if(pid //报告父子进程进程号 printf(“I am Child process %d\nMy father is %d\n”,getpid(),getppid()); pause(); //暂停,等待键盘中断信号唤醒 //子进程被键盘中断信号唤醒继续执行 printf(“%d child will Running: \n”,getpid()); // if(argv[1] != NULL){ //如果在命令行上输入了子进程要执行的命令 //则执行输入的命令 for(i=1; argv[i] != NULL; i++) printf(“%s “,argv[i]); printf(”\n”); //装入并执行新的程序 status = execve(argv[1],&argv[1],NULL); } else{ //如果在命令行上没输入子进程要执行的命令 //则执行缺省的命令 for(i=0; args[i] != NULL; i++) printf(“%s “,args[i]); printf(”\n”); //装入并执行新的程序 status = execve(args[0],args,NULL); } } else //父进程执行代码段 { printf(“\nI am Parent process %d\n”,getpid()); //报告父进程进程号 if(argv[1] != NULL){ //如果在命令行上输入了子进程要执行的命令 //则父进程等待子进程执行结束 printf(“%d Waiting for child done.\n\n”,pid); waitpid(pid,&status,0); //等待子进程结束 printf(“\nMy child exit! status = %d\n\n”,status); } else{ //如果在命令行上没输入子进程要执行的命令 //唤醒子进程,与子进程并发执行不等待子进程执行结束, if(kill(pid,SIGINT) >= 0) printf(“%d Wakeup %d child.\n”,getpid(),pid) ; printf(“%d don’t Wait for child done.\n\n”,getpid()); } } return EXIT_SUCCESS; }

再建立以下名为 pctl.h 的 C 语言头文件: #include #include #include #include #include #include typedef void(sighandler_t)(int); void sigcat(){ printf(“%d process continue\n”,getpid()); } int main(int argc,charargv[]) {

int status_1,status_2; signal(SIGINT,(sighandler_t)sigcat); char *args1[]={“/bin/ls”,“-a”,NULL}; char *args2[]={“/bin/ps”,“-a”,NULL}; int pid1=fork(); if(pid1 printf("\n Father Process starting%d\n ",getpid()); int pid2=fork(); if(pid2>0)//只有pid2结束才运行 {

printf("ps the child process over%d\n",pid2); printf("ls waking%d\n",pid1); waitpid(pid2,&status_2,0); kill(pid1,SIGINT);//运行p1 waitpid(pid1,&status_1,0); printf("ls over%d\n",pid1); printf("Father process over%d\n",getpid()); exit(-1);

} else if(pid2



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有